3. Variables Cuantitativas¶
Procedemos a analizar las variables cuantitativas.
import pandas as pd
import numpy as np
import folium
import math
import time
from scipy import stats
pd.options.mode.chained_assignment = None # default='warn'
from plotnine import ggplot, aes, geom_line, geom_point, geom_bar, geom_boxplot
import scipy.stats as ss
import matplotlib.pyplot as plot
import seaborn as sb
from seaborn import kdeplot
dataframe = pd.read_csv('/home/inma/Master_Data_Science _Contenido/Fundamentos_de_Analisis _de_Datos/Practica/Datos/Melbourne_housing_FULL.csv')
%run -i Variablescuantitativas.py
/home/inma/HH_intro_git_ds/practicaFundamentosAD/Variablescuantitativas.py:190: UserWarning: Boolean Series key will be reindexed to match DataFrame index.
En primer lugar vamos a realizar una inspeccion ocular del dataset:
dataframe2016=dataframe[dataframe["Date"].str[-4:] =='2016']
dataframe2016.describe()
print("precio medio 2016 ",dataframe2016["Price"].mean())
dataframe2017=dataframe[dataframe["Date"].str[-4:] =='2017']
print("precio medio 2017 ",dataframe2017["Price"].mean())
dataframe2017.describe()
dataframe2018=dataframe[dataframe["Date"].str[-4:] =='2018']
print("precio medio 2018 ",dataframe2018["Price"].mean())
dataframe2017.describe()
dataframe.head()
precio medio 2016 1063226.505338962
precio medio 2017 1051144.058702236
precio medio 2018 1017458.4129014697
| Suburb | Address | Rooms | Type | Price | Method | SellerG | Date | Distance | Postcode | ... | Bathroom | Car | Landsize | BuildingArea | YearBuilt | CouncilArea | Lattitude | Longtitude | Regionname | Propertycount | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Abbotsford | 68 Studley St | 2 | h | NaN | SS | Jellis | 3/09/2016 | 2.5 | 3067.0 | ... | 1.0 | 1.0 | 126.0 | NaN | NaN | Yarra City Council | -37.8014 | 144.9958 | Northern Metropolitan | 4019.0 |
| 1 | Abbotsford | 85 Turner St | 2 | h | 1480000.0 | S | Biggin | 3/12/2016 | 2.5 | 3067.0 | ... | 1.0 | 1.0 | 202.0 | NaN | NaN | Yarra City Council | -37.7996 | 144.9984 | Northern Metropolitan | 4019.0 |
| 2 | Abbotsford | 25 Bloomburg St | 2 | h | 1035000.0 | S | Biggin | 4/02/2016 | 2.5 | 3067.0 | ... | 1.0 | 0.0 | 156.0 | 79.0 | 1900.0 | Yarra City Council | -37.8079 | 144.9934 | Northern Metropolitan | 4019.0 |
| 3 | Abbotsford | 18/659 Victoria St | 3 | u | NaN | VB | Rounds | 4/02/2016 | 2.5 | 3067.0 | ... | 2.0 | 1.0 | 0.0 | NaN | NaN | Yarra City Council | -37.8114 | 145.0116 | Northern Metropolitan | 4019.0 |
| 4 | Abbotsford | 5 Charles St | 3 | h | 1465000.0 | SP | Biggin | 4/03/2017 | 2.5 | 3067.0 | ... | 2.0 | 0.0 | 134.0 | 150.0 | 1900.0 | Yarra City Council | -37.8093 | 144.9944 | Northern Metropolitan | 4019.0 |
5 rows × 21 columns
Vemos que tenemos en total 21 variables algunas con aspecto de ser cualitativas y otras cuantitativas. En los proximos puntos iremos analizando las caracteristitcas de las mismas. Vemos en primer lugar el tipo de las variables:
dataframe.dtypes
len(dataframe["Suburb"].unique())
351
aux=pd.DataFrame({"Suburb":pd.value_counts(dataframe['Suburb']),"Method":pd.value_counts(dataframe['Method']),\
"Regionname":pd.value_counts(dataframe['Regionname']),"SellerG":pd.value_counts(dataframe['SellerG']),\
"Method":pd.value_counts(dataframe['Method']),"CouncilArea":pd.value_counts(dataframe['CouncilArea'])})
aux
| Suburb | Method | Regionname | SellerG | CouncilArea | |
|---|---|---|---|---|---|
| @Realty | NaN | NaN | NaN | 12.0 | NaN |
| A | NaN | NaN | NaN | 1.0 | NaN |
| AIME | NaN | NaN | NaN | 1.0 | NaN |
| ASL | NaN | NaN | NaN | 5.0 | NaN |
| Abbotsford | 137.0 | NaN | NaN | NaN | NaN |
| ... | ... | ... | ... | ... | ... |
| iProperty | NaN | NaN | NaN | 1.0 | NaN |
| iSell | NaN | NaN | NaN | 32.0 | NaN |
| iTRAK | NaN | NaN | NaN | 33.0 | NaN |
| viewbank | 1.0 | NaN | NaN | NaN | NaN |
| voglwalpole | NaN | NaN | NaN | 2.0 | NaN |
785 rows × 5 columns
print(dataframe.describe())
aux=pd.DataFrame({"Suburb":dataframe["Suburb"].describe(),"CouncilArea":dataframe["CouncilArea"].describe(),\
"Regionname":dataframe["Regionname"].describe(),"SellerG":dataframe["SellerG"].describe(),\
"Method":dataframe["Method"].describe()})
aux
Rooms Price Distance Postcode Bedroom2 \
count 34857.000000 2.724700e+04 34856.000000 34856.000000 26640.000000
mean 3.031012 1.050173e+06 11.184929 3116.062859 3.084647
std 0.969933 6.414671e+05 6.788892 109.023903 0.980690
min 1.000000 8.500000e+04 0.000000 3000.000000 0.000000
25% 2.000000 6.350000e+05 6.400000 3051.000000 2.000000
50% 3.000000 8.700000e+05 10.300000 3103.000000 3.000000
75% 4.000000 1.295000e+06 14.000000 3156.000000 4.000000
max 16.000000 1.120000e+07 48.100000 3978.000000 30.000000
Bathroom Car Landsize BuildingArea YearBuilt \
count 26631.000000 26129.000000 23047.000000 13742.00000 15551.000000
mean 1.624798 1.728845 593.598993 160.25640 1965.289885
std 0.724212 1.010771 3398.841946 401.26706 37.328178
min 0.000000 0.000000 0.000000 0.00000 1196.000000
25% 1.000000 1.000000 224.000000 102.00000 1940.000000
50% 2.000000 2.000000 521.000000 136.00000 1970.000000
75% 2.000000 2.000000 670.000000 188.00000 2000.000000
max 12.000000 26.000000 433014.000000 44515.00000 2106.000000
Lattitude Longtitude Propertycount
count 26881.000000 26881.000000 34854.000000
mean -37.810634 145.001851 7572.888306
std 0.090279 0.120169 4428.090313
min -38.190430 144.423790 83.000000
25% -37.862950 144.933500 4385.000000
50% -37.807600 145.007800 6763.000000
75% -37.754100 145.071900 10412.000000
max -37.390200 145.526350 21650.000000
| Suburb | CouncilArea | Regionname | SellerG | Method | |
|---|---|---|---|---|---|
| count | 34857 | 34854 | 34854 | 34857 | 34857 |
| unique | 351 | 33 | 8 | 388 | 9 |
| top | Reservoir | Boroondara City Council | Southern Metropolitan | Jellis | S |
| freq | 844 | 3675 | 11836 | 3359 | 19744 |
3.1 Análisis y transfromación de Variables Cualitativas¶
Para cada una de las variables cualitativas del dataframe comprobaremos sus medidas de centralidad y veremos cuales de ellas tiene sentido analizar.
dataframe.describe()
| Rooms | Price | Distance | Postcode | Bedroom2 | Bathroom | Car | Landsize | BuildingArea | YearBuilt | Lattitude | Longtitude | Propertycount | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 34857.000000 | 2.724700e+04 | 34856.000000 | 34856.000000 | 26640.000000 | 26631.000000 | 26129.000000 | 23047.000000 | 13742.00000 | 15551.000000 | 26881.000000 | 26881.000000 | 34854.000000 |
| mean | 3.031012 | 1.050173e+06 | 11.184929 | 3116.062859 | 3.084647 | 1.624798 | 1.728845 | 593.598993 | 160.25640 | 1965.289885 | -37.810634 | 145.001851 | 7572.888306 |
| std | 0.969933 | 6.414671e+05 | 6.788892 | 109.023903 | 0.980690 | 0.724212 | 1.010771 | 3398.841946 | 401.26706 | 37.328178 | 0.090279 | 0.120169 | 4428.090313 |
| min | 1.000000 | 8.500000e+04 | 0.000000 | 3000.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.00000 | 1196.000000 | -38.190430 | 144.423790 | 83.000000 |
| 25% | 2.000000 | 6.350000e+05 | 6.400000 | 3051.000000 | 2.000000 | 1.000000 | 1.000000 | 224.000000 | 102.00000 | 1940.000000 | -37.862950 | 144.933500 | 4385.000000 |
| 50% | 3.000000 | 8.700000e+05 | 10.300000 | 3103.000000 | 3.000000 | 2.000000 | 2.000000 | 521.000000 | 136.00000 | 1970.000000 | -37.807600 | 145.007800 | 6763.000000 |
| 75% | 4.000000 | 1.295000e+06 | 14.000000 | 3156.000000 | 4.000000 | 2.000000 | 2.000000 | 670.000000 | 188.00000 | 2000.000000 | -37.754100 | 145.071900 | 10412.000000 |
| max | 16.000000 | 1.120000e+07 | 48.100000 | 3978.000000 | 30.000000 | 12.000000 | 26.000000 | 433014.000000 | 44515.00000 | 2106.000000 | -37.390200 | 145.526350 | 21650.000000 |
Antes de empezar el analisis de las variables indicar que el coeficiente de asimetria empleado es el de SKEWNESS por tanto para analizar los resultados podemos usar la sigueiente funcion.
Si el coeficiente de asimetría es menor que -1 o mayor que 1, la distribución de la variable es extremadamente sesgada.
Si el coeficiente de asimetría se encuentra entre -1 y -0,5 o entre 0,5 y 1, la distribución de la variable es moderadamente sesgada.
Si el coeficiente de asimetría se encuentra entre -0,5 y 0,5, la distribución de la variable es aproximadamente sesgada.
3.1.1 Analisis de la variable Rooms¶
Esta variable contiene el número de habitaciones de cada propiedad que hay en la muesta. Como se puede ver en la tabla 3.3.1 la variable tiene valor en 34857 toma valores discretos en el rango 1 a 16 dormitorios, que es el máximo encontrado. La mitad de la muestra tiene tres habitaciones o menos y el 75% de pisos tienen entre 1 y 4 habitaciones. A continuacion vamos a ver las frecuencias de la variable
pd.value_counts(dataframe['Rooms'])/dataframe["Rooms"].count()
3 0.432739
2 0.239034
4 0.228247
5 0.049832
1 0.042431
6 0.005852
7 0.000918
8 0.000545
10 0.000172
9 0.000115
12 0.000086
16 0.000029
Name: Rooms, dtype: float64
Como se puede ver mas de un 40% de los pisos vendidos tienen 3 dormitorios que es mas del doble del porcentaje del numero de pisos que tiene 2 dormitorios (un 23%) o 4 dormitorios(un 22,8%).
Pasamos a hacer el cálculo de las medidas de dispersión y simetria calcularemos el coficiente de variación, rango, IQR y simtetria:
mostrar_analisis_var_cuantitativas(dataframe["Rooms"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 32.000296 | 15 | 2.0 | 0.0 | 1 | 16 | 3.031012 |
Como se puede var en la tabla anterio la variable tiene un coeficiente de variacion del 32% con un coeficiente de asimetria igual a 0 por que la variable es simetrica.
mostrar_graf_variables_discretas(dataframe,"Rooms")
dataframe["Rooms_TR"]=dataframe["Rooms"].apply(np.sqrt)
sb.scatterplot(data=dataframe, x="Rooms", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
sb.regplot(x="Rooms", y="Price", data=dataframe);
plot.show()
Como ya se habia comprobado numéricamente la variable es muy simetrica aunque se aprecia unos outliers, viviendas de mas de 7 dormitorios que posteriormente veremos que efecto tienen en los modelos.
A priori no parece necesario tratar de ningún modo esta variable por ser simétrica y los outliers no parecen ser error de muestra.
3.1.2 Análisis de la variable Bedroom2¶
Esta variable contiene el número de dormitorios de cada propiedad. Como se puede ver en la tabla anterior la variable tiene valor en 26640 elementos de la muestra.Toma valores discretos en el rango 0 a 30 dormitorios, que es el máximo encontrado. La mitad de la muestra tiene tres dormitorios o menos y el 75% de pisos tienen entre 0 y 4 dormitorios. Estas cifras llaman la atencion ya que el máximo número de habitaciones de la variable rooms tenia como maximo 16, por lo que esos datos puede que estén mal imputados.
pd.value_counts(dataframe['Bedroom2'])/dataframe["Bedroom2"].count()
3.0 0.445983
4.0 0.238288
2.0 0.216854
5.0 0.053566
1.0 0.036261
6.0 0.006306
7.0 0.001126
0.0 0.000638
8.0 0.000488
9.0 0.000188
10.0 0.000150
30.0 0.000038
12.0 0.000038
20.0 0.000038
16.0 0.000038
Name: Bedroom2, dtype: float64
Los resultados son muy parecidos a los obtenidos con la variable Rooms por lo que no es probable que la variable rooms haga referencia también a número de dormitorios y no solo de habitaciones. Como ya ocurría con la variable rooms casi el 89% de las propiedades tiene entre 2 y 4 dormitorios. Vamos a verificar las medidas de dispersión y asimetría de la variable
mostrar_analisis_var_cuantitativas(dataframe["Bedroom2"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 31.792606 | 30.0 | 2.0 | 0.0 | 0.0 | 30.0 | 3.084647 |
El coeficiente de variacion es muy similar a la variable rooms y con el mismo rango intercuantilico, aunque en este caso el coficiente de asimetría es 0 lo que parece indica que se trata de una distribucion simétrica de los datos. Lo verificaremos con los siguientes diagramas:
mostrar_graf_variables_discretas(dataframe,"Bedroom2")
Como ya se había comprobado numéricamente la variable es muy simétrica aunque se aprecia unos outliers, viviendas de más de 7 dormitorios que se deberían eliminar. También habrá que seleccionar que variable es de mejor calidad para llevar a cabo el modelo.
En este caso la variable tiene un coeficiente de asimetría 0 y algún outlier que veremos posteriormente como afecta al modelo
3.1.3 Analisis de la Variable Distance¶
La variable Distance indica la distancia al centro del inmbueble y toma como unidad las millas. Como se puede ver en la tabla 3.3.1 esta variable tiene valores en 34856 elementos de la muestra. La variable toma valores entre 0 y 48 millas , el 50% de los pisos de la muestra se encuentran a menos de 10,3 millas del centro de la ciudad y la desviacion tipica es 6,78. Calculamos medidas de dispersión y simetría ya que las de centralidad las hemos visto en la tabla inicial con la descripción del dataframe.
mostrar_analisis_var_cuantitativas(dataframe["Distance"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 60.696784 | 48.1 | 7.6 | -0.026316 | 0.0 | 48.1 | 11.184929 |
Según el coeficiente la variable parece bastante simetrica, vemaos el boxplot para cerciorarnos. Vemos la distribucion de la variable y posibles outliers
mostrar_graf_variables_continuas(dataframe,"Distance")
Como indica el coeficiente de asimetría, la variable es ligeramente asimétrica, vamos a intentar que se ajuste mejor a una distribución normal.
dataframe["BathsAndRooms"]=(dataframe["Rooms"]+dataframe["Bathroom"])/dataframe["Distance"].apply(np.sqrt)
dataframe_filtered=dataframe[dataframe["Distance"] >0]
dataframe_filtered.reset_index(drop=True,inplace=True)
sb.scatterplot(data=dataframe, x="Distance", y="Price")
plot.show()
dataframe["Distance_TRA"]=dataframe["Distance"].apply(np.sqrt)
mostrar_graf_variables_continuas(dataframe_filtered,"Distance")
sb.regplot(x="Distance_TRA", y="Price", data=dataframe);
plot.show()
sb.regplot(x="BathsAndRooms", y="Price", data=dataframe);
plot.show()
dataframe.corr()
/home/inma/anaconda3/lib/python3.8/site-packages/numpy/core/function_base.py:153: RuntimeWarning: invalid value encountered in multiply
/home/inma/anaconda3/lib/python3.8/site-packages/numpy/linalg/linalg.py:1965: RuntimeWarning: invalid value encountered in greater
| Rooms | Price | Distance | Postcode | Bedroom2 | Bathroom | Car | Landsize | BuildingArea | YearBuilt | Lattitude | Longtitude | Propertycount | Rooms_TR | BathsAndRooms | Distance_TRA | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Rooms | 1.000000 | 0.465238 | 0.271511 | 0.085890 | 0.946755 | 0.611826 | 0.393878 | 0.037402 | 0.156229 | -0.012749 | 0.004872 | 0.103235 | -0.071677 | 0.990772 | 0.492557 | 0.303786 |
| Price | 0.465238 | 1.000000 | -0.211384 | 0.044950 | 0.430275 | 0.429878 | 0.201803 | 0.032748 | 0.100754 | -0.333306 | -0.215607 | 0.197874 | -0.059017 | 0.460447 | 0.585621 | -0.198883 |
| Distance | 0.271511 | -0.211384 | 1.000000 | 0.481566 | 0.269524 | 0.126201 | 0.241835 | 0.060862 | 0.076301 | 0.323059 | -0.100417 | 0.200946 | -0.018140 | 0.286191 | -0.498291 | 0.975137 |
| Postcode | 0.085890 | 0.044950 | 0.481566 | 1.000000 | 0.089292 | 0.120080 | 0.067886 | 0.040664 | 0.042437 | 0.089805 | -0.231027 | 0.362895 | 0.017108 | 0.083589 | -0.140948 | 0.409997 |
| Bedroom2 | 0.946755 | 0.430275 | 0.269524 | 0.089292 | 1.000000 | 0.614892 | 0.388491 | 0.037019 | 0.154157 | -0.002022 | 0.003447 | 0.106164 | -0.053451 | 0.939649 | 0.465217 | 0.300193 |
| Bathroom | 0.611826 | 0.429878 | 0.126201 | 0.120080 | 0.614892 | 1.000000 | 0.307518 | 0.036333 | 0.147558 | 0.167955 | -0.059183 | 0.106531 | -0.032887 | 0.591324 | 0.573119 | 0.137240 |
| Car | 0.393878 | 0.201803 | 0.241835 | 0.067886 | 0.388491 | 0.307518 | 1.000000 | 0.037829 | 0.104373 | 0.128702 | -0.009020 | 0.047213 | -0.009617 | 0.396106 | 0.091560 | 0.270558 |
| Landsize | 0.037402 | 0.032748 | 0.060862 | 0.040664 | 0.037019 | 0.036333 | 0.037829 | 1.000000 | 0.354530 | 0.044474 | 0.025318 | -0.002582 | -0.018195 | 0.036586 | 0.015453 | 0.047017 |
| BuildingArea | 0.156229 | 0.100754 | 0.076301 | 0.042437 | 0.154157 | 0.147558 | 0.104373 | 0.354530 | 1.000000 | 0.067811 | 0.017155 | -0.002143 | -0.024523 | 0.152220 | 0.077408 | 0.069931 |
| YearBuilt | -0.012749 | -0.333306 | 0.323059 | 0.089805 | -0.002022 | 0.167955 | 0.128702 | 0.044474 | 0.067811 | 1.000000 | 0.091592 | -0.022175 | 0.022420 | -0.020429 | -0.229233 | 0.340103 |
| Lattitude | 0.004872 | -0.215607 | -0.100417 | -0.231027 | 0.003447 | -0.059183 | -0.009020 | 0.025318 | 0.017155 | 0.091592 | 1.000000 | -0.345589 | 0.011112 | 0.010120 | 0.006591 | -0.077277 |
| Longtitude | 0.103235 | 0.197874 | 0.200946 | 0.362895 | 0.106164 | 0.106531 | 0.047213 | -0.002582 | -0.002143 | -0.022175 | -0.345589 | 1.000000 | 0.016326 | 0.098764 | -0.055585 | 0.203296 |
| Propertycount | -0.071677 | -0.059017 | -0.018140 | 0.017108 | -0.053451 | -0.032887 | -0.009617 | -0.018195 | -0.024523 | 0.022420 | 0.011112 | 0.016326 | 1.000000 | -0.076877 | -0.017375 | -0.044839 |
| Rooms_TR | 0.990772 | 0.460447 | 0.286191 | 0.083589 | 0.939649 | 0.591324 | 0.396106 | 0.036586 | 0.152220 | -0.020429 | 0.010120 | 0.098764 | -0.076877 | 1.000000 | 0.478817 | 0.320539 |
| BathsAndRooms | 0.492557 | 0.585621 | -0.498291 | -0.140948 | 0.465217 | 0.573119 | 0.091560 | 0.015453 | 0.077408 | -0.229233 | 0.006591 | -0.055585 | -0.017375 | 0.478817 | 1.000000 | -0.548055 |
| Distance_TRA | 0.303786 | -0.198883 | 0.975137 | 0.409997 | 0.300193 | 0.137240 | 0.270558 | 0.047017 | 0.069931 | 0.340103 | -0.077277 | 0.203296 | -0.044839 | 0.320539 | -0.548055 | 1.000000 |
4.3.4 Analisis de la variable Bathrooms¶
Esta variable indica el número de baños del inmuble.Como se puede ver en la tabla inicial la variable tiene valor en 26631 elementos de la muestra. Toma valores discretos en el rango 0 a 12 dormitorios. El 75% de pisos tienen entre 0 y 2 baños . A continuación, vamos a ver las frecuencias de la variable:
pd.value_counts(dataframe['Bathroom'])/dataframe["Bathroom"].count()
1.0 0.486989
2.0 0.415456
3.0 0.081897
4.0 0.010101
5.0 0.002891
0.0 0.001727
6.0 0.000601
7.0 0.000150
8.0 0.000113
9.0 0.000038
12.0 0.000038
Name: Bathroom, dtype: float64
Como se puede ver en la tabla anterior el 89% de la muestra tiene igual o menos de dos dormitorios con una media de 1,6 baños. En la tabla inicial respecto a las medidas de dispersión podemos ver que la desviación típica es de 0,72 y en la siguiente tabla vemos más variables de dispersión y asimetría:
mostrar_analisis_var_cuantitativas(dataframe["Bathroom"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 44.572429 | 12.0 | 1.0 | -1.0 | 0.0 | 12.0 | 1.624798 |
El coeficiente de variación es del 44% y el coeficiente de asimetria es -1 lo que indica que la variable es moderadamente sesgada, tiene cola a la derecha. comprobaremos esto mismo de manera visual pintando su histograma y boxplot
mostrar_graf_variables_discretas(dataframe,"Bathroom")
sb.regplot(x="Bathroom", y="Price", data=dataframe);
plot.show()
sb.scatterplot(data=dataframe, x="Bathroom", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
dataframe_filtered=dataframe[(dataframe["Bathroom"]>0) & (dataframe["Bathroom"] is not None)]
dataframe["Bathroom_TRA"]=dataframe["Bathroom"].apply(np.sqrt)
dataframe["Price_TRA"]=dataframe["Price"].apply(np.sqrt)
dataframe["Price_TRA"]=np.log2(dataframe["Price"])
#dataframe["Distance_SQR"]=dataframe["Distance"].apply(np.sqrt)
sb.scatterplot(data=dataframe, x="Bathroom_TRA", y="Price")
mostrar_graf_variables_continuas(dataframe,"Bathroom_TRA")
plot.show()
sb.displot(data=dataframe, x="Bathroom_TRA",y="Price_TRA",kind="kde")
plot.show()
#dataframe["Distance_SQR"]=dataframe["Distance"].apply(np.sqrt)
#sb.scatterplot(data=dataframe, x="Distance", y="Price")
#plot.show()
mostrar_graf_variables_continuas(dataframe,"Bathroom_TRA")
sb.regplot(x="Bathroom_TRA", y="Price_TRA", data=dataframe);
plot.show()
#hola
3.1.5 Análisis de la variable Car¶
Esta variable contiene el número de plazas de aparcamiento que tiene asociadas la vivienda. Como se puede ver en la tabla inicial la variable tiene valor en 26129 de la muestra y toma valores discretos en el rango 0 a 26 plazas de aparcamiento. El 75% de pisos tienen entre 0 y 2 plazas de aparcamiento . A continuacion vamos a ver las frecuencias de la variable:
pd.value_counts(dataframe['Car'])/dataframe["Car"].count()
2.0 0.467450
1.0 0.350721
0.0 0.062421
3.0 0.061464
4.0 0.044433
5.0 0.005779
6.0 0.005358
7.0 0.000957
8.0 0.000880
10.0 0.000230
9.0 0.000115
11.0 0.000077
26.0 0.000038
12.0 0.000038
18.0 0.000038
Name: Car, dtype: float64
Como se puede ver casi el 47% de las casas de la muestra tienen dos plaza de aparcamiento y el 81% entre 1 y 2 plazas de aparcamiento.Respecto a las medidas de dispersión, en la tabla inicial podemos ver que la desviación típica es de 1.01. En la siguiente tabla vemos más variables de dispersión y asimetría:
mostrar_analisis_var_cuantitativas(dataframe["Car"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 58.465078 | 26.0 | 1.0 | -1.0 | 0.0 | 26.0 | 1.728845 |
Como se puede ver hay un coeficiente de variación alto y asimetría por la izquierda que verificaremos mejor haciendo algunos diagramas
mostrar_graf_variables_discretas(dataframe,"Car")
sb.scatterplot(data=dataframe, x="Car", y="Price")
mostrar_graf_variables_continuas(dataframe,"Car")
plot.show()
3.1.6 Analisis de la variable Landsize¶
Esta variable contiene el tamaño del terreno asociado a la vivienda, excluye los metros de la vivienda y está calculada en metros cuadrados. La media de terreno asociado al inmbueble es de 593.598993 El 75% de pisos tienen menos de 670 metros cuadrados de parcela. A continuacion vamos a ver las frecuencias de la variable:
mostrar_analisis_var_cuantitativas(dataframe["Landsize"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 572.582161 | 433014.0 | 446.0 | -0.331839 | 0.0 | 433014.0 | 593.598993 |
La variable es aproximadamente sesgada a la izquierda y con un rango de valores muy amplio.Pintamos algunos gráficos para entender mejor la asimietría y la dispersión del a variablable
mostrar_graf_variables_continuas(dataframe,"Landsize")
Vamos a eliminar el registro superior que está desvirtuando el gráfico para poder analizarlo con mas detalle
#Eliminamos outliers superiores para poder seguir analizando
df_filtered=dataframe[dataframe["Landsize"]<20000]
print("registros filtrado = ",(dataframe["Landsize"].count()-df_filtered["Landsize"].count()))
mostrar_graf_variables_continuas(df_filtered,"Landsize")
sb.scatterplot(data=df_filtered, x="Landsize", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
registros filtrado = 23
Continua habiendo outliers que hacen que la variabe sea muy dispersa por lo que la variable es clara condidata a ser transformada
#dataframe=dataframe[dataframe["Distance"].notna()]
dataframe_filtered=dataframe[(dataframe["Landsize"]>0) ]
#dataframe_filtered.reset_index(drop=True,inplace=True)
#dataframe_filtered["Landsize_TRA"]=stats.boxcox(dataframe_filtered["Distance"])[0]
#dataframe_filtered["Landsize_TRA"]=dataframe_filtered["Landsize"].apply(np.sqrt)
dataframe_filtered["Landsize_TRA"]=np.log(dataframe_filtered["Landsize"])
sb.scatterplot(data=dataframe_filtered, x="Landsize_TRA", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
#dataframe_filtered['Landsize_TRA'] = np.where(dataframe['Landsize'] >= 40000, 40000, (dataframe['Landsize']//100)*100)
#dataframe_filtered['Landsize_TRA'] = np.where(dataframe_filtered['Landsize_TRA'] <= 70, 70, dataframe_filtered['Landsize_TRA'])
sb.displot(data=dataframe_filtered, x="Landsize_TRA",y="Price")
plot.show()
#dataframe["Distance_SQR"]=dataframe["Distance"].apply(np.sqrt)
#sb.scatterplot(data=dataframe, x="Distance", y="Price")
#plot.show()
mostrar_graf_variables_continuas(dataframe_filtered,"Landsize_TRA")
3.1.7 Análisis de la variable BulldingArea¶
Esta variable contiene el el tamaño del terreno asociado a la vivienda en metros cuadrados. Como se puede ver en la tabla inicial la variable tiene valor en 13742 elementos de la muestra.La media del tamaño de los inmubles de 160.25640 y toma valores continuos en el rango 0 a 44515 . El 75% de pisos tienen menos de 188.00000 metros cuadrado. A continuacion, vamos a ver las medidas de dispersión de la varibale:
mostrar_analisis_var_cuantitativas(dataframe["BuildingArea"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 250.390661 | 44515.0 | 86.0 | 0.209302 | 0.0 | 44515.0 | 160.2564 |
Como se puede ver la variable tiene asimetria a la derecha, pero en la tabla inicial vimos que la desviación estándar era muy alta para el valor que tomaba la media. Pasamos a comprobar visualmente la simetria.
mostrar_graf_variables_continuas(dataframe,"BuildingArea")
Como se puede ver hay claramente algún outlier que desvirtua la muestra (ya lo pudimos ver tambien en la tabla inicial donde la media era de 522 y el máximo era mas de 44000 metros cuadrados de parcela). Eliminamos el el máximo en cuestión y repintamos los gráficos
#Eliminamos el maximo y vemos que ocurre
df_filtered=dataframe[dataframe["BuildingArea"]<1000]
print("registros filtrado = ",(dataframe["BuildingArea"].count()-df_filtered["BuildingArea"].count()))
mostrar_graf_variables_continuas(df_filtered,"BuildingArea")
#df_filtered["BuildingArea_TRA"]=np.log(dataframe_filtered["BuildingArea"])
df_filtered["BuildingArea_TRA"]=df_filtered["Distance"].apply(np.sqrt)
sb.scatterplot(data=df_filtered, x="BuildingArea_TRA", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
df_filtered=dataframe[dataframe["YearBuilt"]>1800]
sb.scatterplot(data=df_filtered, x="YearBuilt", y="Price")
#mostrar_graf_variables_continuas(dataframe_filtered,"Distance_SQR")
plot.show()
registros filtrado = 13
Los datos sin ese registro tienen mejor aspecto y parecen muy concentrados.
3.1.8 Análisis de la variable PropertyCountss¶
Esta variable contiene el numero de viviendas existentes en el barrio. Como se puede ver en la tabla inicial la variable tiene valor en 34854 y toma valores discretos en el rango 83 a 21650(que es el máximo de viviendas en un barrio). El 75% de pisos están en barrios con 10412 viviendas o menos. A continuación vamos a ver las frecuencias de la variable:
mostrar_analisis_var_cuantitativas(dataframe["Propertycount"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 58.472938 | 21567.0 | 6027.0 | 0.210884 | 83.0 | 21650.0 | 7572.888306 |
La variable es aproximadamente sesgada a la derecha , lo comprobaremos visalmente:
mostrar_graf_variables_continuas(dataframe,"Propertycount")
3.1.9 Análisis de la variable Latitud¶
Esta variable contiene la coordenada geográfica correspondiente a la latitud y longitud del inmueble. Como se puede ver en las tablas de abajo.
mostrar_analisis_var_cuantitativas(dataframe["Lattitude"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | -0.238766 | 0.80023 | 0.10885 | -0.016996 | -38.19043 | -37.3902 | -37.810634 |
mostrar_analisis_var_cuantitativas(dataframe["Longtitude"])
| coeficiente de Variacion | rango de la variable | rango intercuartilico | coeficiente de asimetria | Min | Max | Mean | |
|---|---|---|---|---|---|---|---|
| 0 | 0.082874 | 1.10256 | 0.1384 | -0.073699 | 144.42379 | 145.52635 | 145.001851 |
Pintamos la distribución de los precios por localización tomando la latitud y longitud de las casas.
Se dividió por intervalos de precio y se asignó un color a cada uno de ellos.
-Color Azul -->['Price'] < float('500000.0')
-color Verde-->['Price'] >= float('500000.0')) & (v['Price'] < float('800000.0'))
-Color Amarillo-->['Price'] >= float('800000.0')) & (v['Price'] < float('1200000.0'))
-Color cian-->['Price'] >= float('1200000.0'))& (v['Price'] < float('1500000.0'))
-Color Rojo-->['Price'] >= float('1500000.0'))& (v['Price'] < float('1800000.0'))
-Color Naranja-->['Price'] >= float('1800000.0'))& (v['Price'] < float('2100000.0'))
-Color Morado-->['Price'] >= float('2100000.0'))
mapa